package mitlab.seg.ner;

import mitlab.seg.ner.domain.SegItem;
import mitlab.seg.ner.library.DATDictionary;

public class GetWordsImpl implements GetWords {

  /**
   * offe : 当前词的偏移量
   */
  public int offe;

  /**
   * 构造方法，同时加载词典,传入词语相当于同时调用了setStr() ;
   */
  public GetWordsImpl(String str) {
    setStr(str);
  }

  /**
   * 构造方法，同时加载词典
   */
  public GetWordsImpl() {}

  int charsLength = 0;

  @Override
  public void setStr(String str) {
    setChars(str.toCharArray(), 0, str.length());
  }

  @Override
  public void setChars(char[] chars, int start, int end) {
    this.chars = chars;
    i = start;
    this.start = start;
    charsLength = end;
    checkValue = 0;
  }

  public char[] chars;
  private int charHashCode;
  private int start = 0;
  public int end = 0;
  private int baseValue = 0;
  private int checkValue = 0;
  private int tempBaseValue = 0;
  public int i = 0;
  private String str = null;

  @Override
  public String allWords() {
    for (; i < charsLength; i++) {
      charHashCode = chars[i];
      end++;
      switch (getStatement()) {
        case 0:
          if (baseValue == chars[i]) {
            str = String.valueOf(chars[i]);
            offe = i;
            start = ++i;
            end = 0;
            baseValue = 0;
            tempBaseValue = baseValue;
            return str;
          } else {
            int startCharStatus = DATDictionary.getItem(chars[start]).getStatus();
            if (startCharStatus == 1) { // 如果start的词的status为1，则将start设为i；否则start加1
              start = i;
              i--;
              end = 0;
              baseValue = 0;
            } else {
              i = start;
              start++;
              end = 0;
              baseValue = 0;
            }
            break;
          }
        case 2:
          i++;
          offe = start;
          tempBaseValue = baseValue;
          return DATDictionary.getItem(tempBaseValue).getName();
        case 3:
          offe = start;
          start++;
          i = start;
          end = 0;
          tempBaseValue = baseValue;
          baseValue = 0;
          return DATDictionary.getItem(tempBaseValue).getName();
      }

    }
    end = 0;
    baseValue = 0;
    i = 0;
    return null;
  }

  /**
   * 根据用户传入的c得到单词的状态. 0.代表这个字不在词典中 1.继续 2.是个词但是还可以继续 3.停止已经是个词了
   * 
   * @param c
   * @return
   */
  private int getStatement() {
    checkValue = baseValue;
    baseValue = DATDictionary.getItem(checkValue).getBase() + charHashCode;
    if (baseValue < DATDictionary.arrayLength
        && (DATDictionary.getItem(baseValue).getCheck() == checkValue
            || DATDictionary.getItem(baseValue).getCheck() == -1)) {
      return DATDictionary.getItem(baseValue).getStatus();
    }
    return 0;
  }

  public SegItem getItem() {
    return DATDictionary.getItem(tempBaseValue);
  }

  @Override
  public int getOffe() {
    return offe;
  }

}
